/**
 @file cli_message.h
 @brief Implementación de la interfaz del usuario con el servicio de intercambio de mensajes.
 @date   5/11/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef CLI_MESSAGE_H_
#define CLI_MESSAGE_H_

#include "cli_message_def.h"
#include "list.h"

//#define USR_MSG_DEBUG

//! @brief Estructura de datos para almacenar la lista de de nodos.
typedef struct{
    char id[20]; //!< identificador del nodo
    struct list_head list; //!< representa los apuntadores de la lista de nodos
} node_t;

/*!
   @brief Inicialización de la interfaz con el servicio de intercambio de mensajes y de la lista de nodos destino.
   @return 0 en caso de exito. -1 en caso de error.
 */
int msgSvcInit();

/*!
   @brief Finalización de la interfaz con el servicio de intercambio de mensajes.
   @return 0 en caso de exito. -1 en caso de error.
 */
int msgSvcExit();

/*!
   @brief Solicita una nueva lista de nodos al servidor, para inicializar la propia.
   @return 0 en caso de exito. -1 en caso de error.
 */
int requestNodeList();

/*!
   @brief Actualiza la lista de nodos solicitando redescubrimiento.
   @return 0 en caso de exito. -1 en caso de error.
 */
int updateNodeList();

/*!
   @brief Envía un mensaje de capa aplicación en unicast o broadcast.
   @param msg El mensaje a enviar.
   @return 0 en caso de exito. -1 en caso de error.
 */
int sendMessage(struct msg_t msg);

/*!
   @brief Envía un mensaje de capa aplicación en multicast.
   @param msg El mensaje a enviar.
   @param *list lista de nodos destino.
   @return 0 en caso de exito. -1 en caso de error.
 */
int sendMulticast(struct msg_t msg, dest_list_t *list);

/*!
   @brief Obtiene la respuesta al último comando enviado si existe y fué solicitada.
   @return Apuntador a la data de la respuesta. NULL en caso de error.
   @see createMsg()
 */
uint8_t * getResponse();

/*!
   @brief Envía un mensaje de capa aplicación
   @param msg El mensaje a enviar.
   @param list lista de nodos destino. Si esta lista contiene elementos el mensaje se enviará en multicast hacia estos destinatarios. @see dest_list_t
   @return 0 en caso de exito. -1 en caso de error.
 */
int msgOutput(struct msg_t msg, dest_list_t* list);

#endif /* MESSAGE_H_ */
